// 定义常用值和引用数据类型、事件和事件处理程序、接口、特性和处理异常的基础类和基类
using System;
// 定义集合
using System.Collections.Generic;
// 定义Linq表达式
using System.Linq;
// 定义微软旗下跨平台Asp.Net的MVC架构
using Microsoft.AspNetCore.Mvc;
// 本项目中的实体类
using MyApi.Entity;
// 本项目中的参数模型类
using MyApi.ParamModel;
// JSON序列化工具
using Newtonsoft.Json;
// 本项目中的Repository
using MyApi.Repository;
// 拓展配置
using Microsoft.Extensions.Configuration;
// 本项目中的工具类
using MyApi.Utils;
// 认证
using Microsoft.AspNetCore.Authorization;


namespace MyApi.Controllers
{
    [Authorize]
    [ApiController]
    [Route("[controller]")]

    // 定义一个用户控制器类
    public class UsersController : ControllerBase
    {
        // 定义一个私有的字段
        private IRepository<Users> _usersRepository;
        // 令牌参数字段
        private TokenParameter _tokenParameter;
        // 依赖注入，用来加载配置值
        private readonly IConfiguration _configuration;

        // 构造函数
        public UsersController(IConfiguration configuration, IRepository<Users> usersRepository)
        {
            _configuration = configuration;
            _usersRepository = usersRepository;
            _tokenParameter = _configuration.GetSection("TokenParameter").Get<TokenParameter>();
        }

        // 无参查询
        [HttpGet]
        public dynamic Get()
        {
            // 查询所有的用户
            var users = _usersRepository.Table.ToList();
            // 将获取到的所有用户返回出去
            return new
            {
                Code = 200,
                Data = users,
                Msg = "获取用户列表成功！"
            };
        }

        // 有参查询
        [HttpGet("{id}")]
        public dynamic Get(int id)
        {
            // 获取指定Id的用户
            var user = _usersRepository.GetById(id);
            if (user != null)
            {
                // 用户存在
                return new
                {
                    Code = 200,
                    Data = user,
                    Msg = string.Format("你查询的Id为{0},查询成功！", id)
                };
            }
            else
            {
                // 用户不存在
                return new
                {
                    Code = 400,
                    Data = "",
                    Msg = string.Format("你查询的Id为{0},经查询，无此用户！", id)
                };
            }
        }

        // 增加
        [HttpPost]
        public dynamic Post(NewUser model)
        {
            // Json序列化设置
            JsonSerializerSettings settings = new JsonSerializerSettings();
            // 设置中的引用循环处理设置为忽略
            settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

            // 获取用户账户和密码保存到user中
            var user = new Users
            {
                Username = model.Username,
                Password = model.Password
            };
            // 往数据库中插入信息
            _usersRepository.Insert(user);

            // 提示信息
            var res = new
            {
                Code = 200,
                Data = user,
                Msg = string.Format("数据插入成功！")
            };
            // 将Json转换序列化对象后的信息返回
            return JsonConvert.SerializeObject(res, settings);
        }

        // 修改
        [HttpPut("{id}")]
        public dynamic Put(int id, NewUser model)
        {
            // 找到要修改的Id所对应的用户
            var user = _usersRepository.GetById(id);
            // 用户不为空
            if (user != null)
            {
                // 更新后的用户名赋值给数据库中
                user.Username = model.Username;
                // 更新后的密码赋值给数据库中
                user.Password = model.Password;
                // 将表中的更新时间修改为现在时间
                user.UpdatedTime = DateTime.Now;
                // 往数据库中执行更新操作
                _usersRepository.Update(user);
                // 返回修改成功信息
                return new
                {
                    Code = 200,
                    Data = user,
                    Msg = string.Format("Id为{0}的用户信息已成功修改！", id)
                };
            }
            else
            {
                // 返回失败信息
                return new
                {
                    Code = 400,
                    Msg = string.Format("Id为{0}的用户不存在，修改失败！", id)
                };
            }
        }

        // 删除
        [HttpDelete("{id}")]
        public dynamic Delete(int id)
        {
            // 获取需要删除的Id所对应的用户
            var user = _usersRepository.GetById(id);
            // 用户存在
            if (user != null)
            {
                // 删除操作
                _usersRepository.Delete(id);
                // 返回删除成功信息
                return new
                {
                    Code = 200,
                    Msg = string.Format("Id为{0}的用户信息已成功删除！", id)
                };
            }
            else
            {
                return new
                {
                    Code = 400,
                    Msg = string.Format("Id为{0}的用户不存在，删除失败！", id)
                };
            }
        }

        // 允许匿名
        [AllowAnonymous]
        // 登录判断，获取Token
        [HttpPost, Route("token")]
        public dynamic GetToken(NewUser model)
        {
            // 获取账户
            var username = model.Username.Trim();
            // 获取密码
            var password = model.Password.Trim();
            // 从数据库中查询判断用户
            var user = _usersRepository.Table.Where(x => x.Username == username && x.Password == password).FirstOrDefault();
            // 判断该用户是否存在
            if (user == null)
            {
                return new
                {
                    Code = 400,
                    Data = user,
                    Msg = "用户名或密码不正确，请核实后重试！"
                };
            }
            else
            {
                // 生成Token
                var token = TokenHelper.GenerateToken(_tokenParameter, user);
                // 更新Token
                var refreshToken = "123456";

                var res = new
                {
                    Code = 200,
                    Data = new { Token = token, RefreshToken = refreshToken },
                    Msg = "用户登录成功，获取Token成功！"
                };
                return res;
            }
        }
    }
}